all repos — caroster @ v0.10.0

[Octree] Group carpool to your event https://caroster.io

frontend/pages/e/[uuid]/waitingList.tsx (view raw)

 1import {useState, useMemo, PropsWithChildren} from 'react';
 2import EventLayout, {TabComponent} from '../../../layouts/Event';
 3import {EventByUuidDocument} from '../../../generated/graphql';
 4import useProfile from '../../../hooks/useProfile';
 5import WaitingList from '../../../containers/WaitingList';
 6import {AddPassengerToWaitingList} from '../../../containers/NewPassengerDialog';
 7import {initializeApollo} from '../../../lib/apolloClient';
 8
 9interface NewPassengerDialogContext {
10  addSelf: boolean;
11}
12
13interface Props {
14  eventUUID: string;
15}
16
17const Page = (props: PropsWithChildren<Props>) => {
18  return <EventLayout {...props} Tab={WaitingListTab} />;
19};
20
21const WaitingListTab: TabComponent = ({event}) => {
22  const {user} = useProfile();
23  const [addPassengerToWaitingListContext, toggleNewPassengerToWaitingList] =
24    useState<NewPassengerDialogContext | null>(null);
25
26  const canAddSelf = useMemo(() => {
27    if (!user) return false;
28    const isInWaitingList = event?.waitingPassengers?.some(
29      passenger => passenger.user?.id === `${user.id}`
30    );
31    const isInTravel = event?.travels?.some(travel =>
32      travel.passengers?.some(passenger => passenger.user?.id === `${user.id}`)
33    );
34    return !(isInWaitingList || isInTravel);
35  }, [event, user]);
36
37  return (
38    <>
39      <WaitingList
40        canAddSelf={canAddSelf}
41        getToggleNewPassengerDialogFunction={(addSelf: boolean) => () =>
42          toggleNewPassengerToWaitingList({addSelf})}
43      />
44      {!!addPassengerToWaitingListContext && (
45        <AddPassengerToWaitingList
46          open={!!addPassengerToWaitingListContext}
47          toggle={() => toggleNewPassengerToWaitingList(null)}
48          addSelf={addPassengerToWaitingListContext.addSelf}
49        />
50      )}
51    </>
52  );
53};
54
55export async function getServerSideProps(ctx) {
56  const {uuid} = ctx.query;
57  const apolloClient = initializeApollo();
58  const {data = {}} = await apolloClient.query({
59    query: EventByUuidDocument,
60    variables: {uuid},
61  });
62  const {eventByUUID: event} = data;
63  const {host = ''} = ctx.req.headers;
64
65  return {
66    props: {
67      event,
68      eventUUID: uuid,
69      metas: {
70        title: event?.name || '',
71        url: `https://${host}${ctx.resolvedUrl}`,
72      },
73    },
74  };
75}
76
77export default Page;